Issues of data storage arise almost everywhere in the modern world, especially as the need for ever more storage increases. Some of the typical goals for a data storage system include availability, reliability, capacity and performance. Of course, these goals often conflict.
The situation has become even more complicated with the advent of various forms of distributed storage, in which not only data sets (defined in the broadest sense as any related collection of digital information, including both executable and non-executable data) as a whole but even different portions of single data sets may be stored on different devices. Indeed, even unsophisticated users nowadays interact with storage systems in the “cloud”, such that they may have no idea on which continent(s), much less on which server(s) or disk(s), their data resides. In such an environment of distributed storage, two other challenges faced by enterprise IT managers are the need to reduce IT costs and the desire to increase flexibility and nimbleness.
One way to better achieve these goals is to change the nature of the data centers. In the past, enterprise data centers consisted mainly of a melange of dedicated servers connected to a collection of storage area network (SAN)-attached storage arrays. Deployment of a new application thereby involved purchasing a new server, provisioning a logical unit number (LUN) on the array and installing the application. More recently, however, system designers have been leveraging new technologies, such as machine virtualization.
Virtualization is now found at almost every layer of a system stack, from virtualization of an entire “computer” in the form of a virtual machine (VM) to virtualization of individual components. The virtualization technique of course extends to data storage as well.
One well-known method for data storage virtualization is Redundant Array of Independent Disk (RAID) technology, in which, as the name implies, data is stored in a distributed manner, in more than one storage device. The several standard RAID “levels” represent different choices in the trade-offs between the different storage goals. In systems configured according to certain of the RAID levels, data sets are divided into blocks which are grouped into larger “stripe units” which are stored on different disks. Furthermore, in most RAID levels, by either writing redundant copies (“mirroring”) of the stripe units, or including at least some form of error correction, such as one or more stripe units consisting of parity bits, data that is lost, for example, by failure of a disk, can be reconstructed and thereby recovered.
In a typical real-world implementation, hundreds if not thousands of clients, that is, software or hardware entities may want to write a large number of data sets and blocks—even into the billions—to many storage devices within potentially many disk arrays. This leads to inevitable and sometimes daunting bookkeeping challenges, especially when different entities may need to read the same data. For example, if the data set of one entity is written over, say, ten different disks, and one of the disks physically fails, then there must be some way for not only the original, writing entity but also all other entities that may need to read it to find the “missing” data on whatever other server/array/disk each stripe was either mirrored or reconstructed on. One way to meet these challenges is to implement at least one degree of address indirection, with appropriate mapping tables that the system software layer establishes and maintains. There is an ever-present need to improve the ability of such systems with respect to flexibility, ease of administration and/or efficiency of reconstruction of missing data, among other improvement challenges.